Eager Loading এবং তার ব্যবহার

Java Technologies - আইবাটিস (iBATIS) - Lazy Loading এবং Eager Loading
224

iBATIS (MyBatis), যা বর্তমানে MyBatis নামে পরিচিত, একটি SQL ম্যাপিং ফ্রেমওয়ার্ক যা SQL কুয়েরি এবং Java objects-এর মধ্যে সম্পর্ক স্থাপন করে। Eager Loading হল একটি ORM (Object-Relational Mapping) কৌশল, যেখানে সম্পর্কিত ডেটা (যেমন ফোরেন কীগুলির মাধ্যমে সম্পর্কিত অবজেক্ট) লোড করা হয় ডেটাবেস থেকে যখন মূল অবজেক্টটি লোড করা হয়। iBATIS/MyBatis-এ Eager Loading সাধারণত join বা fetch কৌশল ব্যবহার করে হয়, যা সম্পর্কিত ডেটা একসাথে লোড করে।

iBATIS (MyBatis)-এ Eager Loading কৌশলের ব্যবহার এবং সেটআপ সম্পর্কে এখানে বিস্তারিত আলোচনা করা হবে।


1. What is Eager Loading?

Eager Loading হল একটি কৌশল যেখানে যখন একটি অবজেক্ট লোড করা হয়, তখন তার সম্পর্কিত অবজেক্টগুলো (যেমন One-to-Many, Many-to-One, বা Many-to-Many) একই সাথে ডেটাবেস থেকে লোড করা হয়। অর্থাৎ, Lazy Loading-এর বিপরীতে, যেখানে সম্পর্কিত অবজেক্টগুলো শুধুমাত্র প্রয়োজন হলে লোড হয়, Eager Loading সম্পর্কিত সমস্ত ডেটা একসাথে লোড করে।

Eager Loading এর সুবিধা:

  • একাধিক সম্পর্কিত অবজেক্টের ডেটা একসাথে লোড করা হয়, ফলে পরবর্তীতে ওই অবজেক্টগুলো রিট্রিভ করতে অতিরিক্ত SQL কোয়েরি চালাতে হয় না।
  • যখন আপনি জানেন যে, সম্পর্কিত ডেটাগুলির প্রয়োজন হবে, তখন এটি পারফরম্যান্সের জন্য কার্যকর হতে পারে।

Eager Loading এর অসুবিধা:

  • যদি সম্পর্কিত ডেটা অনেক বড় বা জটিল হয়, তবে একসাথে সব কিছু লোড করলে performance bottlenecks হতে পারে।
  • অতিরিক্ত ডেটা লোড হওয়া উক্ত কেসে memory ব্যবহার বাড়িয়ে দিতে পারে।

2. iBATIS (MyBatis) Eager Loading Implementation

iBATIS (MyBatis)-এ Eager Loading অর্জন করতে সাধারণত join কুয়েরি ব্যবহার করা হয়, যেখানে সম্পর্কিত টেবিলগুলির ডেটা একসাথে লোড করা হয়।

a) One-to-Many Relationship Eager Loading

ধরা যাক, আমাদের একটি Student ক্লাস রয়েছে, এবং সেই Student ক্লাসের সাথে সম্পর্কিত একাধিক Course অবজেক্টের তথ্য রিট্রিভ করতে হবে। এই ধরনের সম্পর্কের জন্য Eager Loading ব্যবহার করতে পারেন।

Example: SQL Query for One-to-Many Relationship
<select id="getStudentWithCourses" resultMap="studentWithCoursesMap">
    SELECT s.id AS student_id, s.name AS student_name, c.id AS course_id, c.name AS course_name
    FROM student s
    LEFT JOIN course c ON s.id = c.student_id
    WHERE s.id = #{id}
</select>

<resultMap id="studentWithCoursesMap" type="com.example.Student">
    <id property="id" column="student_id"/>
    <result property="name" column="student_name"/>
    <collection property="courses" ofType="com.example.Course">
        <id property="id" column="course_id"/>
        <result property="name" column="course_name"/>
    </collection>
</resultMap>

Explanation:

  • LEFT JOIN: student টেবিলের সাথে course টেবিলের ডেটা যোগ করা হচ্ছে student_id এর মাধ্যমে।
  • <collection>: এটি student এর সাথে সম্পর্কিত সমস্ত course অবজেক্ট লোড করে। এটি Eager Loading এর উদাহরণ, যেখানে একসাথে ছাত্র এবং তার কোর্সের সব তথ্য রিট্রিভ করা হচ্ছে।

b) Many-to-One Relationship Eager Loading

একটি Course অবজেক্টের সাথে সম্পর্কিত Instructor অবজেক্টের তথ্য লোড করার জন্য Many-to-One সম্পর্কের জন্য Eager Loading ব্যবহার করতে হবে।

Example: SQL Query for Many-to-One Relationship
<select id="getCourseWithInstructor" resultType="com.example.Course">
    SELECT c.id AS course_id, c.name AS course_name, i.id AS instructor_id, i.name AS instructor_name
    FROM course c
    LEFT JOIN instructor i ON c.instructor_id = i.id
    WHERE c.id = #{id}
</select>

Explanation:

  • LEFT JOIN: course টেবিলের সাথে instructor টেবিলের ডেটা যোগ করা হচ্ছে instructor_id এর মাধ্যমে।
  • LEFT JOIN ব্যবহারের মাধ্যমে Eager Loading নিশ্চিত করা হচ্ছে, যা course এবং তার সম্পর্কিত instructor এর তথ্য একসাথে লোড করে।

3. Using @FetchType.EAGER Annotation in JPA (When using JPA with iBATIS)

যদি আপনি iBATIS এর সাথে JPA ব্যবহার করছেন, তবে আপনি FetchType.EAGER অ্যানোটেশন ব্যবহার করতে পারেন। এটি Eager Loading নির্ধারণ করতে সাহায্য করে।

Example: Using @ManyToOne with FetchType.EAGER
@Entity
public class Course {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "instructor_id")
    private Instructor instructor;

    // Getters and Setters
}

Explanation:

  • @ManyToOne(fetch = FetchType.EAGER): এটি নির্দেশ করে যে, Course অবজেক্টের সাথে সম্পর্কিত Instructor অবজেক্টকে Eagerly লোড করতে হবে, অর্থাৎ Course অবজেক্ট লোড করার সময় তার সম্পর্কিত Instructor অবজেক্টও একসাথে লোড হবে।

4. Eager Loading in iBATIS Using ResultMaps

iBATIS (MyBatis)-এ ResultMap ব্যবহার করে সম্পর্কিত অবজেক্টগুলির Eager Loading করা যায়। আপনি <resultMap> ব্যবহার করে সম্পর্কিত টেবিলের ডেটা ম্যাপ করতে পারেন এবং একটি সম্পর্কিত Java object (বা collection) রিটার্ন করতে পারেন।

Example: Eager Loading with ResultMap

<resultMap id="studentMap" type="com.example.Student">
    <id property="id" column="student_id"/>
    <result property="name" column="student_name"/>
    <collection property="courses" ofType="com.example.Course">
        <id property="id" column="course_id"/>
        <result property="name" column="course_name"/>
    </collection>
</resultMap>

<select id="getStudentWithCourses" resultMap="studentMap">
    SELECT s.id AS student_id, s.name AS student_name, c.id AS course_id, c.name AS course_name
    FROM student s
    LEFT JOIN course c ON s.id = c.student_id
    WHERE s.id = #{id}
</select>

Explanation:

  • <collection>: এটি student অবজেক্টের সাথে সম্পর্কিত course অবজেক্টের একটি সংগ্রহকে লোড করবে। এটি Eager Loading ব্যবহার করে।

5. Advantages and Disadvantages of Eager Loading

Advantages:

  1. Fewer Database Queries: সম্পর্কিত ডেটা একসাথে লোড করা হয়, ফলে পরবর্তীতে আলাদা আলাদা কোয়েরি পাঠানোর প্রয়োজন হয় না।
  2. Performance Boost: যদি সম্পর্কিত ডেটা ব্যবহার করা হয়, তাহলে একসাথে লোড করার ফলে network latency কমে যায় এবং পারফরম্যান্স বাড়ে।

Disadvantages:

  1. Memory Usage: অতিরিক্ত ডেটা একসাথে লোড করার কারণে memory ব্যবহারে বৃদ্ধি হতে পারে।
  2. Complexity in Handling Large Data Sets: যদি সম্পর্কিত ডেটা খুব বড় হয়, তবে একসাথে সব কিছু লোড করলে পারফরম্যান্স সমস্যা তৈরি হতে পারে।

Eager Loading iBATIS (MyBatis)-এ সম্পর্কিত টেবিলের ডেটা একসাথে লোড করার একটি কৌশল যা বিশেষ করে One-to-Many এবং Many-to-One সম্পর্কের ক্ষেত্রে উপকারী। JOIN এবং ResultMap ব্যবহার করে আপনি সহজেই Eager Loading বাস্তবায়ন করতে পারেন। যদিও Eager Loading অনেক ক্ষেত্রে পারফরম্যান্সের জন্য উপকারী, তবে যখন সম্পর্কিত ডেটার পরিমাণ অনেক বেশি হয়, তখন এটি মেমরি সমস্যা সৃষ্টি করতে পারে, সেক্ষেত্রে Lazy Loading ব্যবহার করা হতে পারে বেশি কার্যকর।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...